﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Lesson13
{
    internal class Program
    {
        static void Main(string[] args)
        {
            #region List排序

            // 1、List自带的排序方法
            List<int> list = new List<int>();
            list.Add(1);
            list.Add(3);
            list.Add(2);
            list.Add(5);
            list.Add(4);
            for (int i = 0; i < list.Count; i++)
            {
                Console.WriteLine(list[i]);
            }

            list.Sort();
            Console.WriteLine("排序后：");
            for (int i = 0; i < list.Count; i++)
            {
                Console.WriteLine(list[i]);
            }

            // ArrayList中也有Sort方法

            // 2、自定义类的排序
            List<Pay> list2 = new List<Pay>();
            list2.Add(new Pay(100));
            list2.Add(new Pay(50));
            list2.Add(new Pay(200));
            list2.Add(new Pay(150));
            list2.Add(new Pay(300));

            list2.Sort();
            Console.WriteLine("排序后：");
            for (int i = 0; i < list2.Count; i++)
            {
                Console.WriteLine(list2[i].Money);
            }

            // 3、通过委托函数进行排序
            List<Person> list3 = new List<Person>();
            list3.Add(new Person(18));
            list3.Add(new Person(20));
            list3.Add(new Person(16));
            list3.Add(new Person(25));
            list3.Add(new Person(22));

            list3.Sort(SortPersonByAge);  // 传一个函数进去

            // 匿名函数
            list3.Sort(delegate (Person x, Person y)
            {
                // 1、升序
                //return x.Age - y.Age;
                // 2、降序
                return y.Age - x.Age;
            });

            // lambda表达式的简写
            list3.Sort((x, y) =>
            {
                // 1、升序
                 return x.Age - y.Age;
                // 2、降序
                //return y.Age - x.Age;
            });

            #endregion
        }

        // 定义一个排序函数
        static int SortPersonByAge(Person x, Person y)
        {
            // 传入两个对象，为列表中的两个对象
            // 进行两两比较
            return x.Age - y.Age;
        }
    }

    // 自定义类要想能排序 需要实现IComparable 可排序的接口
    class Pay : IComparable<Pay>
    {
        public int Money { get; set; }
        public Pay(int money)
        {
            Money = money;
        }

        public int CompareTo(Pay other)
        {
            // 返回值的含义
            // 等于0 相等 保持当前位置
            // 小于0 放在传入对象的前面
            // 大于0 放在传入对象的后面
            //return 0;


            // 1、升序
            // return this.Money - other.Money;
            // 2、降序
            return other.Money - this.Money;
        }
    }

    class Person
    {
        public int Age { get; set; }

        public Person(int age)
        {
            Age = age;
        }
    }
}
